textiter: fix bug in find_visible_by_log_attrs()
authorSébastien Wilmet <swilmet@gnome.org>
Tue, 15 Jul 2014 17:02:54 +0000 (19:02 +0200)
committerSébastien Wilmet <swilmet@gnome.org>
Thu, 17 Jul 2014 10:56:57 +0000 (12:56 +0200)
find_by_log_attrs() can return true only in this case:
return moved && !gtk_text_iter_is_end (arg_iter);

So if the iter moved (i.e. something has been found), but is the end
iter, find_by_log_attrs() returns false.

Now the same checks are made in find_visible_by_log_attrs(). The public
functions using find_visible_by_log_attrs() say in their documentation
that false is returned for the end iter, hence the check with
gtk_text_iter_is_end().

https://bugzilla.gnome.org/show_bug.cgi?id=618852

gtk/gtktextiter.c
testsuite/gtk/textiter.c

index 889103e53fad136f33e3aeadcd2f6a7e1824d6f3..5a53581252d5bdd6100bff04bda126583cebce5b 100644 (file)
@@ -3183,12 +3183,19 @@ find_visible_by_log_attrs (GtkTextIter     *iter,
 
   pos = *iter;
 
-  while (find_by_log_attrs (&pos, func, forward))
+  while (TRUE)
     {
+      GtkTextIter pos_before = pos;
+
+      find_by_log_attrs (&pos, func, forward);
+
+      if (gtk_text_iter_equal (&pos_before, &pos))
+        break;
+
       if (!_gtk_text_btree_char_is_invisible (&pos))
        {
          *iter = pos;
-         return TRUE;
+         return !gtk_text_iter_is_end (iter);
        }
     }
 
index f3b0963443140d4a409219be5b767b76043e9ace..ef8790da237078cbf60e083ef6896cdcc4c8603c 100644 (file)
@@ -475,7 +475,7 @@ test_visible_word_boundaries (void)
   check_backward_visible_word_start (buffer, 0, 0, FALSE);
 
   gtk_text_buffer_set_text (buffer, "ab", -1);
-  check_forward_visible_word_end (buffer, 0, 0, FALSE); /* FIXME result_offset should be 2 */
+  check_forward_visible_word_end (buffer, 0, 2, FALSE);
 
   /* Buffer contents: "b c " with "b" invisible */
   gtk_text_buffer_set_text (buffer, "", -1);
@@ -573,7 +573,7 @@ test_visible_cursor_positions (void)
   check_visible_cursor_position (buffer, TRUE, 0, 3, TRUE);
   check_visible_cursor_position (buffer, TRUE, 1, 3, TRUE);
   check_visible_cursor_position (buffer, TRUE, 2, 3, TRUE);
-  check_visible_cursor_position (buffer, TRUE, 3, 3, FALSE); /* FIXME result offset should be 4, not 3 */
+  check_visible_cursor_position (buffer, TRUE, 3, 4, FALSE);
   check_visible_cursor_position (buffer, TRUE, 4, 4, FALSE);
 
   /* backward */